package EncapsulationTest;

/**
 *
 * 面向对象的特征：封装与隐藏
 * 一、问题的引入：
 *      当我们创建一个类的对象以后，我们可以通过“对象.属性”的方式，对对象的属性进行赋值。
 *      这里，赋值的操作要受到属性的数据类型和存储范围的制约。但是除此之外，没有其他制约条件。
 *      但是，在实际问题之中，我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现。
 *      我们只能通过方法进行限制条件的添加。比如（setLegs（））
 *      同时我们需要避免用户再使用“对象.属性”的方式进行赋值，则需要将属性声明为私有的。
 *      此时，针对于属性就实现了封装性。
 *
 * 二、封装性的体现:
 *      我们将类的属性私有化（private），同时，提供公共的方法（public）来获取（getXxx）和设置（setXxx）
 *
 *      拓展：封装性的体现：（1）如上
 *                      （2）不对外暴露的私有的方法
 *                      （3）单例模式。。。
 *
 * 三、封装性的体现需要权限修饰符来配合
 *      1.Java规定的四种权限（从小到大排列）：private、缺省（default）、protected、 public
 *      2.4种权限可以用来修饰类及类的内部结构：属性、方法、构造器、内部类
 *      3.具体的，4种权限可以用来修饰类及类的内部结构：属性、方法、构造器、内部类
 *              修饰类的话：只能缺省或者public
 **/

public class AnimalTest {

    public static void main(String[] args) {

        Animal animal = new Animal();
        animal.name ="李鹏";
        animal.age = 1;
//        animal.legs = 4;
        animal.show();
    }

}

class Animal{

    String name;
    int age;
    private int legs;

    public void setLegs(int l){
        if (l >= 0 && l / 2 == 0){
            legs = 1;
        }else{
            legs = 0;
        }
    }

    public int getLegs() {
        return legs;
    }

    public void eat(){
        System.out.println("动物进食");
    }

    public void show(){
        System.out.println("name =" + name + ",age =" + age + ",legs =" + legs);
    }
}
